package 力扣算法练习.main1.part1;

import java.util.ArrayList;

public class day4 {
    /*
    给你一个整数 x ，如果 x 是一个回文整数，返回 true ；否则，返回 false 。
    回文数是指正序（从左向右）和倒序（从右向左）读都是一样的整数。
    例如，121 是回文，而 123 不是。
    https://leetcode.cn/problems/palindrome-number
     */
    public boolean isPalindrome(int x) {
        if (x < 0) return false;
        if (x < 10) return true;
        //先将每一位存入集合然后再比较
        ArrayList<Integer> temp = new ArrayList<>();
        while (x != 0) {
            temp.add(x % 10);
            x /= 10;
        }
        int n = temp.size() - 1, b = 0;
        while (b < n) {
            if (!temp.get(n--).equals(temp.get(b++))) return false;
        }
        return true;
    }


    /*
    给定一个长度为 n 的整数数组height。有n条垂线，第 i 条线的两个端点是(i, 0)和(i, height[i])。
    找出其中的两条线，使得它们与x轴共同构成的容器可以容纳最多的水。
    返回容器可以储存的最大水量。
    https://leetcode.cn/problems/container-with-most-water
     */
    //如果不优化就会超过时间限制
    public int maxArea(int[] height) {
        if (height.length == 1) return 0;
        //通过双层循环算出每一种结果然后保留最大的
        int temp, result = 0, t;
        int ti = 0;
        for (int i = 0; i < height.length; i++) {
            if (height[i] < ti) continue;//优化:如果遍历的高度(数值)比之前的高度(数值)还小就跳过
            ti = height[i];//如果能执行到这里说明ti比height[i]小就把值赋给ti
            for (int j = i + 1; j < height.length; j++) {
                t = Math.min(height[i], height[j]);
                temp = t * (j - i);
                if (temp > result) result = temp;
            }
        }
        return result;
    }

    //官方解(双指针)
    public int maxArea1(int[] height) {
        int l = 0, r = height.length - 1;
        int ans = 0;
        while (l < r) {
            int area = Math.min(height[l], height[r]) * (r - l);
            ans = Math.max(ans, area);
            if (height[l] <= height[r]) {
                ++l;
            } else {
                --r;
            }
        }
        return ans;
    }
}
